// @Description 认证相关数据传输对象
// @Author  xiaoyang
// @Date  2025/06/18

package dto

import (
	"errors"
	"github.com/gin-gonic/gin"
	"golang-manage-admin/lib"
	"regexp"
)

// LoginForm 登录请求表单
type LoginForm struct {
	Username  string `json:"username" binding:"required" example:"admin"`    // 用户名
	Password  string `json:"password" binding:"required" example:"123456"`   // 密码
	Captcha   string `json:"captcha" binding:"required" example:"1234"`      // 验证码
	CaptchaId string `json:"captcha_id" binding:"required" example:"abc123"` // 验证码ID
}

// BindValidParam 绑定并验证参数
func (lf *LoginForm) BindValidParam(c *gin.Context) error {
	// 数据绑定 + 常规数据校验
	if err := lib.DefaultGetValidParams(c, lf); err != nil {
		return err
	}
	// 数据校验(特殊校验)
	return lf.CheckParam()
}

// CheckParam 参数校验
func (lf *LoginForm) CheckParam() error {
	// 用户名长度校验
	if len(lf.Username) < 3 || len(lf.Username) > 50 {
		return errors.New("用户名长度必须在3-50个字符之间")
	}
	// 密码长度校验
	if len(lf.Password) < 6 {
		return errors.New("密码长度不能少于6个字符")
	}
	return nil
}

// RegisterForm 注册请求表单
type RegisterForm struct {
	Username        string `json:"username" binding:"required" example:"testuser"`            // 用户名
	Password        string `json:"password" binding:"required" example:"123456"`              // 密码
	ConfirmPassword string `json:"confirm_password" binding:"required" example:"123456"`      // 确认密码
	Nickname        string `json:"nickname" example:"测试用户"`                                   // 昵称
	Email           string `json:"email" binding:"required,email" example:"test@example.com"` // 邮箱
	Phone           string `json:"phone" example:"13800138000"`                               // 手机号
	Captcha         string `json:"captcha" binding:"required" example:"1234"`                 // 验证码
	CaptchaId       string `json:"captcha_id" binding:"required" example:"abc123"`            // 验证码ID
}

// BindValidParam 绑定并验证参数
func (rf *RegisterForm) BindValidParam(c *gin.Context) error {
	// 数据绑定 + 常规数据校验
	if err := lib.DefaultGetValidParams(c, rf); err != nil {
		return err
	}
	// 数据校验(特殊校验)
	return rf.CheckParam()
}

// CheckParam 参数校验
func (rf *RegisterForm) CheckParam() error {
	// 用户名长度校验
	if len(rf.Username) < 3 || len(rf.Username) > 50 {
		return errors.New("用户名长度必须在3-50个字符之间")
	}
	// 密码长度校验
	if len(rf.Password) < 6 {
		return errors.New("密码长度不能少于6个字符")
	}
	// 密码确认校验
	if rf.Password != rf.ConfirmPassword {
		return errors.New("两次输入的密码不一致")
	}
	// 手机号格式校验（如果提供）
	if rf.Phone != "" {
		phoneRegex := regexp.MustCompile(`^1[3-9]\d{9}$`)
		if !phoneRegex.MatchString(rf.Phone) {
			return errors.New("手机号格式不正确")
		}
	}
	return nil
}

// ChangePasswordForm 修改密码表单
type ChangePasswordForm struct {
	OldPassword     string `json:"old_password" binding:"required" example:"123456"`     // 旧密码
	NewPassword     string `json:"new_password" binding:"required" example:"654321"`     // 新密码
	ConfirmPassword string `json:"confirm_password" binding:"required" example:"654321"` // 确认密码
}

// BindValidParam 绑定并验证参数
func (cpf *ChangePasswordForm) BindValidParam(c *gin.Context) error {
	// 数据绑定 + 常规数据校验
	if err := lib.DefaultGetValidParams(c, cpf); err != nil {
		return err
	}
	// 数据校验(特殊校验)
	return cpf.CheckParam()
}

// CheckParam 参数校验
func (cpf *ChangePasswordForm) CheckParam() error {
	// 新密码长度校验
	if len(cpf.NewPassword) < 6 {
		return errors.New("新密码长度不能少于6个字符")
	}
	// 密码确认校验
	if cpf.NewPassword != cpf.ConfirmPassword {
		return errors.New("两次输入的新密码不一致")
	}
	// 旧密码和新密码不能相同
	if cpf.OldPassword == cpf.NewPassword {
		return errors.New("新密码不能与旧密码相同")
	}
	return nil
}

// UserSearchForm 用户搜索表单
// @Description 用户列表搜索参数
type UserSearchForm struct {
	Page     int    `form:"page" json:"page" comment:"页码"`             // 页码
	PageSize int    `form:"page_size" json:"page_size" comment:"每页数量"` // 每页数量
	Keyword  string `form:"keyword" json:"keyword" comment:"关键字"`      // 关键字（用户名、昵称、邮箱）
	Status   *int   `form:"status" json:"status" comment:"状态"`         // 状态：1启用 0禁用
}

// BindValidParam 绑定并验证参数
func (usf *UserSearchForm) BindValidParam(c *gin.Context) error {
	// 数据绑定 + 常规数据校验
	if err := lib.DefaultGetValidParams(c, usf); err != nil {
		return err
	}
	// 设置默认值
	if usf.Page <= 0 {
		usf.Page = 1
	}
	if usf.PageSize <= 0 {
		usf.PageSize = 10
	}
	if usf.PageSize > 100 {
		usf.PageSize = 100
	}
	return nil
}

// UserInfoResponse 用户信息响应
// @Description 用户信息响应结构
type UserInfoResponse struct {
	ID          uint     `json:"id"`            // 用户ID
	Username    string   `json:"username"`      // 用户名
	Nickname    string   `json:"nickname"`      // 昵称
	Email       string   `json:"email"`         // 邮箱
	Phone       string   `json:"phone"`         // 手机号
	Avatar      string   `json:"avatar"`        // 头像
	Status      int      `json:"status"`        // 状态
	Roles       []string `json:"roles"`         // 角色列表
	Permissions []string `json:"permissions"`   // 权限列表
	LastLoginAt string   `json:"last_login_at"` // 最后登录时间
}

// LoginResponse 登录响应
// @Description 登录成功响应结构
type LoginResponse struct {
	Token     string           `json:"token"`      // JWT令牌
	ExpiresAt int64            `json:"expires_at"` // 过期时间
	UserInfo  UserInfoResponse `json:"user_info"`  // 用户信息
}
